home *** CD-ROM | disk | FTP | other *** search
/ PC-Blue - MS DOS Public Domain Library / PC-Blue MS-DOS Public Domain Library - NYACC.iso / vol025 / othello.bas < prev    next >
Encoding:
BASIC Source File  |  1987-01-11  |  8.6 KB  |  254 lines

  1. 1000 REM  OTHELLO -- PET VERSION -- MODIFIED BY PATRICK   LEABO
  2. 1010 REM                                        TUCSON, ARIZONA
  3. 1020 REM                                             3-82
  4. 1025 REM NOT DONE YET BUT HAVE FUN -- PLEASE ADD A GOOD ALGORITHM TO IT
  5. 1026 REM
  6. 1030 SCREEN 0,0:COLOR 7,0:WIDTH 80:KEY OFF
  7. 1040 E$="":FOR I= 1 TO 39:E$= E$+ " ":NEXT
  8. 1050 D$= CHR$ (11)
  9. 1060 FOR I= 1 TO 20:D$= D$+ CHR$ (10):NEXT
  10. 1070 XL= 3:XH= 6:YL= 3:YH= 6
  11. 1080 DIM A(9,9),I4(7),J4(7),D$(2),P$(2):Z0= 0
  12. 1090 CLS:LOCATE 1,20:PRINT "GREETINGS FROM OTHELLO"
  13. 1100 PRINT :PRINT "OTHELLO  IS PLAYED ON AN 8 X 8 BOARD, ROWS NUMBERED"
  14. 1110 PRINT "1 TO 8  AND COLUMNS A TO H.   THE INITIAL CONFIGURATION IS"
  15. 1120 PRINT "ALL BLANK EXCEPT FOR THE CENTER FOUR SQUARES, TRY TO PLACE"
  16. 1130 PRINT "YOUR PIECE SO THAT IT OUTFLANKS YOUR  OPPONENT, CREATING "
  17. 1140 PRINT "HORIZONTAL, VERTICAL, OR DIAGONAL RUN OF OPPOSING PIECES,"
  18. 1150 PRINT "TURNING THEM INTO YOURS."
  19. 1160 PRINT
  20. 1170 PRINT:PRINT
  21. 1180 PRINT "EXAMPLE: RED OUTFLANKS BLUE, CAPTURING FOUR BLUE PIECES."
  22. 1190 PRINT "2MAKE YOUR MOVE BY ENTERING A NUMBER FOR THE ROW AND A LETTER"
  23. 1200 PRINT "FOR THE COLUMN.  "
  24. 1210 PRINT "NOTE: YOU MUST CAPTURE AT LEAST ONE OF MY PIECES IN THIS WAY "
  25. 1220 PRINT "IF IT IS POSSIBLE.  IF IT IS NOT POSSIBLE, YOU FORFEIT YOUR"
  26. 1230 PRINT "MOVE BY ENTERING 0 A FOR YOUR MOVE."
  27. 1240 PRINT :PRINT "HOW MANY PLAYERS (1 OR 2)? ";:GOSUB 3220:IF VAL (X$)= 0 OR VAL (X$)> 2 THEN 1240
  28. 1250 PRINT X$:NP= VAL (X$):PRINT 
  29. 1260 IF NP= 2 THEN PRINT "PLAYER #1 GOES FIRST WHEN THE PLAY STARTS"
  30. 1270 SOUND 3000,2:INPUT "ENTER PLAYER 1,S NAME! ";P$(1):P$(1)= P$(1)+" "+ CHR$(2)
  31. 1280 SOUND 3000,2:IF NP= 2 THEN INPUT "ENTER PLAYER 2'S NAME! ";P$(2):P$(2)= P$(2)+" "+CHR$(1)
  32. 1290 IF NP= 2 THEN 1350
  33. 1300 PRINT :PRINT "SHOULD I PLAY MY BEST?";
  34. 1310 S2= 0:S4= 0:S5= 0:P$(2)= "IBM PC"
  35. 1320 GOSUB 3220:IF X$= "N"THEN PRINT "NO":GOTO 1350
  36. 1330 PRINT "YES"
  37. 1340 S2= 2:S4= 1:S5= - 2
  38. 1350 B= - 1:W= 1:PT= 0
  39. 1360 D$(B+ 1)= "RED":N$(B+ 1)= "RED "
  40. 1370 D$(0+ 1)= "BLANK"
  41. 1380 D$(W+ 1)= "BLUE":N$(W+ 1)= "BLUE"
  42. 1390 FOR K= 0 TO 7
  43. 1400 READ I4(K),J4(K)
  44. 1410 NEXT 
  45. 1420 FOR I= 0 TO 9:FOR J= 0 TO 9
  46. 1430 A(I,J)= 0
  47. 1440 NEXT J,I
  48. 1450 A(4,4)= W:A(5,5)= W
  49. 1460 A(4,5)= B:A(5,4)= B
  50. 1470 SC(1)= 2:SC(2)= 2:N1= 4:Z= 0
  51. 1480 C= B:H= W
  52. 1490 FOR NN= 1 TO 3000:NEXT :CLS
  53. 1500 GOSUB 3300
  54. 1510 IF NP= 2 THEN 2020
  55. 1520 PRINT D$"DO YOU WANT TO GO FIRST ? ";
  56. 1530 PT= 1:GOSUB 3220:IF X$= "Y"THEN PRINT "YES":PT= 0:GOTO 2020
  57. 1540 PT= 1:PRINT "NO":PRINT D$E$D$"OK, I AM THINKING!"
  58. 1550 REM  COMPUTERS MOVE
  59. 1560 IF NP= 1 THEN TIME$="0:0:0":GOTO 1600
  60. 1570 IF PT= 2 THEN B1= - 1:I3= 0:J3= 0:T1= C:T2= H
  61. 1580 IF PT= 1 THEN B1= - 1:I3= 0:J3= 0:T1= H:T2= C
  62. 1590 GOTO 2030
  63. 1600 PT= PT+ 1:IF PT> 2 THEN PT= 1
  64. 1610 B1= - 1:I3= 0:J3= 0:T1= C:T2= H
  65. 1620 FOR I= YL TO YH:FOR J= XL TO XH
  66. 1630 IF A(I,J)< > 0 THEN 1790
  67. 1640 GOSUB 2740
  68. 1650 IF F1= Z0 THEN 1790
  69. 1660 U= - 1
  70. 1670 GOSUB 2780
  71. 1680 IF S1= Z0 THEN 1790
  72. 1690 IF (I= 1)OR (I= 8)THEN S1= S1+ S2
  73. 1700 IF (J= 1)OR (J= 8)THEN S1= S1+ S2
  74. 1710 IF (I= 2)OR (I= 7)THEN S1= S1+ S5
  75. 1720 IF (J= 2)OR (J= 7)THEN S1= S1+ S5
  76. 1730 IF (I= 3)OR (I= 6)THEN S1= S1+ S4
  77. 1740 IF (J= 3)OR (J= 6)THEN S1= S1+ S4
  78. 1750 IF S1< B1 THEN 1790
  79. 1760 IF S1> B1 THEN 1780
  80. 1770 IF RND (1)> .5 THEN 1790
  81. 1780 B1= S1:I3= I:J3= J
  82. 1790 NEXT J,I
  83. 1800 IF B1> 0 THEN 1880
  84. 1810 IF S5= 0 THEN 1840
  85. 1820 IF NP= 1 THEN S5= 0:GOTO 1610
  86. 1830 S5= 0:GOTO 1550
  87. 1840 S5= 0:PRINT D$ E$ D$"I HAVE TO FORFEIT MY MOVE"
  88. 1850 IF Z= 1 THEN 2430
  89. 1860 Z= 1
  90. 1870 GOTO 2020
  91. 1880 Z= 0
  92. 1890 PRINT D$E$D$"I WILL MOVE TO ";RIGHT$ (STR$ (I3),1)" "CHR$ (J3+ 64)
  93. 1900 GOSUB 3090 REM 5
  94. 1910 I= I3:J= J3:U= 1
  95. 1920 GOSUB 2780
  96. 1930 SC(PT)= SC(PT)+ S1+ 1
  97. 1940 OP= PT+ 1:IF OP= 3 THEN OP= 1
  98. 1950 SC(OP)= SC(OP)- S1
  99. 1960 N1= N1+ 1
  100. 1970 PRINT D$E$D$"THAT GIVES ME ";
  101. 1980 PRINT S1;
  102. 1990 PRINT " OF YOUR PIECES"
  103. 2000 GOSUB 3390
  104. 2010 IF SC(OP)= 0 OR N1= 64 THEN 2430
  105. 2020 T1= H:T2= C
  106. 2030 PT= PT+ 1:IF PT> 2 THEN PT= 1
  107. 2040 IF PT= 2 THEN B1= - 1:I3= 0:J3= 0:T1= C:T2= H
  108. 2050 IF PT= 1 THEN B1= - 1:I3= 0:J3= 0:T1= H:T2= C
  109. 2060 BEEP
  110. 2070 TIME$="0:0:0":PRINT D$;E$D$;P$(PT)", INPUT YOUR MOVE ! ";:GOSUB 3020
  111. 2080 IF (I< 0)OR (J< 0)OR (J> 8)OR (I> 8)THEN 2040
  112. 2090 IF I< > 0 THEN 2160
  113. 2100 PRINT D$;E$D$;"ARE YOU FORFEITING YOUR TURN ? ";
  114. 2110 GOSUB 3220:IF X$< > "Y"THEN PRINT "NO":GOTO 2040
  115. 2120 PRINT "YES"
  116. 2130 IF Z= 1 THEN 2430
  117. 2140 Z1= 1
  118. 2150 GOTO 1550
  119. 2160 IF A(I,J)= 0 THEN 2190
  120. 2170 PRINT D$"SORRY,SQUARE OCCUPIED; TRY AGAIN"
  121. 2180 GOTO 2270
  122. 2190 GOSUB 2740
  123. 2200 IF F1= 1 THEN 2230
  124. 2210 PRINT D$""E$D$"SORRY,NOT NEXT TO MY PIECES; TRY AGAIN"
  125. 2220 GOTO 2270
  126. 2230 U= - 1
  127. 2240 GOSUB 2780
  128. 2250 IF S1> 0 THEN 2290
  129. 2260 PRINT D$""E$D$"SORRY,DOESN'T FLANK A ROW; TRY AGAIN"
  130. 2270 PRINT E$D$:BEEP:FOR N=1 TO 2000:NEXT
  131. 2280 GOTO 2040
  132. 2290 Z= 0:GOSUB 3150
  133. 2300 PRINT D$""E$D$""P$(PT)" THAT GIVES YOU ";
  134. 2310 PRINT S1;
  135. 2320 PRINT " PIECE";:IF S1> 1 THEN PRINT "S";
  136. 2330 PRINT :PRINT E$D$
  137. 2340 U= 1
  138. 2350 GOSUB 2780
  139. 2360 SC(PT)= SC(PT)+ S1+ 1
  140. 2370 OP= PT+ 1:IF OP= 3 THEN OP= 1
  141. 2380 SC(OP)= SC(OP)- S1
  142. 2390 N1= N1+ 1
  143. 2400 GOSUB 3390
  144. 2410 IF SC(OP)= 0 OR N1= 64 THEN 2430
  145. 2420 GOTO 1550
  146. 2430 PRINT D$;E$:PRINT E$:PRINT E$
  147. 2440 PRINT D$;E$D$;P$(1)"  HAS "SC(1)" PIECES   ";
  148. 2450 PRINT P$(2)" HAS "SC(2)" PIECES"
  149. 2460 IF SC(1)= SC(2)THEN 2510
  150. 2470 IF NP= 2 THEN 2540
  151. 2480 IF SC(1)> SC(2)THEN 2530
  152. 2490 PRINT "SORRY, I WON THAT ONE.";
  153. 2500 GOTO 2540
  154. 2510 PRINT "ITS A TIE !!";
  155. 2520 GOTO 2680
  156. 2530 PRINT "YOU WON!!!!!!";
  157. 2540 C1= SC(1)- SC(2)
  158. 2550 IF C1> 0 THEN 2570
  159. 2560 C1= - C1
  160. 2570 C1= (64* C1)/ N1
  161. 2580 PRINT "THAT WAS A ";
  162. 2590 IF C1< 11 THEN 2670
  163. 2600 IF C1< 25 THEN 2660
  164. 2610 IF C1< 39 THEN 2650
  165. 2620 IF C1< 53 THEN 2640
  166. 2630 PRINT "PERFECT GAME":GOTO 2680
  167. 2640 PRINT "WALKAWAY":GOTO 2680
  168. 2650 PRINT "FIGHT":GOTO 2680
  169. 2660 PRINT "HOT GAME":GOTO 2680
  170. 2670 PRINT "SQUEAKER"
  171. 2680 PRINT 
  172. 2690 PRINT "DO YOU WANT TO PLAY ANOTHER GAME ? ";:BEEP
  173. 2700 GOSUB 3220:IF X$= "Y"THEN PRINT "YES";:RUN 1040
  174. 2710 PRINT "NO"
  175. 2720 PRINT "THANKS FOR PLAYING."
  176. 2730 END
  177. 2740 F1= Z0:FOR I1= - 1 TO 1:FOR J1= - 1 TO 1:IF A(I+ I1,J1+ J)= T2 THEN 2760
  178. 2750 NEXT J1,I1:RETURN 
  179. 2760 F1= 1:RETURN 
  180. 2770 REM  CHECK FOR COUNT & FLANKING PIECES
  181. 2780 S1= Z0:FOR K= 0 TO 7
  182. 2790 S3= Z0:I5= I4(K):J5= J4(K):I6= I+ I5:J6= J+ J5
  183. 2800 IF A(I6,J6)< > T2 THEN 2910
  184. 2810 S3= S3+ 1:I6= I6+ I5:J6= J6+ J5
  185. 2820 IF A(I6,J6)= T1 THEN 2850
  186. 2830 IF A(I6,J6)= Z0 THEN 2910
  187. 2840 GOTO 2810
  188. 2850 S1= S1+ S3
  189. 2860 IF U< > 1 THEN 2910
  190. 2870 I6= I:J6= J
  191. 2880 FOR K1= 0 TO S3
  192. 2890 A(I6,J6)= T1:I6= I6+ I5:J6= J6+ J5
  193. 2900 NEXT K1
  194. 2910 NEXT K
  195. 2920 RETURN 
  196. 2930 REM  3SET SEARCH LIMITS FOR COMPUTER MOVE5
  197. 2940 IF I= YL THEN YL= YL- 1:IF YL< 1 THEN YL= 1
  198. 2950 IF I= YH THEN YH= YH+ 1:IF YH> 8 THEN YH= 8
  199. 2960 IF J= XL THEN XL= XL- 1:IF XL< 1 THEN XL= 1
  200. 2970 IF J= XH THEN XH= XH+ 1:IF XH> 8 THEN XH= 8
  201. 2980 LOCATE 1,1:PRINT TI$;"   "
  202. 2990 RETURN 
  203. 3000 REM  INPUT SUBROUTINE5"
  204. 3010 PRINT D$E$"BAD MOVE; TRY AGAIN."
  205. 3020 I= - 1:J= - 1
  206. 3030 FOR K= 1 TO 2
  207. 3040 GOSUB 3220
  208. 3050 G= ASC (X$)
  209. 3060 IF 47< G AND G< 58 THEN I= G- 48:PRINT ""X$"  ";
  210. 3070 IF 64< G AND G< 74 THEN J= G- 64:PRINT ""X$"  ";
  211. 3080 NEXT :PRINT :RETURN 
  212. 3090 REM BLINK COMPUTERS MOVE5
  213. 3100 LOCATE 2* J3+ 3,4* I3+ 1:COLOR 26,0:PRINT CHR$(1):COLOR 7,0
  214. 3110 I= I3:J= J3
  215. 3120 GOSUB 2940
  216. 3130 FOR NN= 1 TO 1000:NEXT 
  217. 3140 RETURN 
  218. 3150 REM BLINK PLAYERS MOVE5
  219. 3160 IF PT= 2 THEN CC= 0
  220. 3170 IF PT= 1 THEN CC= 2
  221. 3180 LOCATE 2* J+ 3,4* I+ 1:COLOR 26,0:PRINT CHR$(2):COLOR 7,0
  222. 3190 GOSUB 2940
  223. 3200 FOR NN= 1 TO 500:NEXT 
  224. 3210 RETURN 
  225. 3220 REM INPUT STATEMENTS
  226. 3230 SOUND 3000,2
  227. 3240 X$=INKEY$:IF X$="" THEN 3240 ELSE IF X$=CHR$(27) THEN CHAIN "MENU",1000 ELSE RETURN
  228. 3250 REM  PRINT SCORE
  229. 3260 LOCATE 5,36:PRINT CHR$(2);RIGHT$ ("  "+ STR$ (SC(1)),3);" ":LOCATE 19,36:PRINT CHR$(1);RIGHT$ ("  "+ STR$ (SC(2)),3);" ";:LOCATE 1,1
  230. 3270 RETURN
  231. 3280 REM BOARD DATA
  232. 3290 DATA 0,1,-1,1,-1,0,-1,-1,0,-1,1,-1,1,0,1,1
  233. 3300 REM 5 OTHER OTHELLO BOARD
  234. 3310 CLS:LOCATE 1,10:PRINT "O T H E L L O"
  235. 3320 LOCATE 3,5:PRINT"1   2   3   4   5   6   7   8"
  236. 3330 FOR N=1 TO 8:LOCATE 3+2*N,1:PRINT CHR$(N+64):NEXT
  237. 3340 LOCATE 4,3  :PRINT"╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗":FOR N=1 TO 13 STEP 2
  238. 3350 LOCATE 4+N,3:PRINT"║   ║   ║   ║   ║   ║   ║   ║   ║"
  239. 3360 LOCATE 5+N,3:PRINT"╠═══╬═══╬═══╬═══╬═══╬═══╬═══╬═══╣":NEXT
  240. 3370 LOCATE 4+N,3:PRINT"║   ║   ║   ║   ║   ║   ║   ║   ║"
  241. 3380 LOCATE 5+N,3:PRINT"╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝"
  242. 3390 FOR I= 1 TO 8
  243. 3400 FOR J= 1 TO 8:LOCATE 2* J+ 3,4* I+ 1:FACE= (A(I,J)+ 3)/2
  244. 3410 IF FACE = 1.5 THEN PRINT" " ELSE PRINT CHR$(FACE)
  245. 3420 NEXT J,I
  246. 3430 GOSUB 3250
  247. 3440 RETURN
  248. 3450 END 
  249. (A(I,J)+ 3)/2
  250. 3410 IF FACE = 1.5 THEN PRINT" " ELSE PRINT CHR$(FACE)
  251. 3420 NEXT J,I
  252. 3430 GOSUB 3250
  253. 3440 RETURN
  254. 3450 E